package admin

import (
	"fmt"
	"github.com/360EntSecGroup-Skylar/excelize"
	"github.com/kataras/iris/v12"
	"io"
	"iris_blog/config"
	"iris_blog/utils"
	"os"
	"path"
	"strconv"
)

var maxSize int

func init() {
	// 设置文件上传大小
	config := config.InitConfig()
	maxSize = config.MaxUpload * iris.MB

}

type Uplaod struct {
	Max int
	ImgAddress string
}

/*
上传任意文件
*/
func (u Uplaod) Upload(i iris.Context) {

	// 设置文件上传大小
	i.SetMaxRequestBodySize(int64(maxSize))

	// 读取file文件
	f, fileHeader, err := i.FormFile("file")
	// 读取文件流失败
	if err != nil {
		i.StopWithError(iris.StatusBadRequest, err)
		return
	}
	// 关闭文件流
	defer f.Close()

	// 文件后缀
	extName := path.Ext(fileHeader.Filename)
	// 创建文件路径
	ok, pathDir := Mkdir(extName, "/any")
	if !ok {
		i.JSON(map[string]interface{}{
			"msg":  "创建文件路径失败",
			"data": "上传失败",
			"code": false,
		})
		return
	}
	// 保存图片
	i.SaveFormFile(fileHeader, pathDir)

	i.JSON(map[string]interface{}{
		"msg":      "文件上传成功",
		"code": 20000,
		"data":    u.ImgAddress+pathDir,
		"filename": fileHeader.Filename,
	})
}

/*
上传图片
*/
func (u Uplaod) UploadImg(i iris.Context) {
	// 设置文件上传大小
	i.SetMaxRequestBodySize(int64(maxSize))

	// 读取file文件
	f, fileHeader, err := i.FormFile("file")
	// 读取文件流失败
	if err != nil {
		i.StopWithError(iris.StatusBadRequest, err)
		return
	}
	// 关闭文件流
	defer f.Close()

	// 文件后缀
	extName := path.Ext(fileHeader.Filename)
	// 获取配置文件  组成 map对象
	config := config.InitConfig()
	extMap := config.AllowExtMap
	fmt.Println(extMap)

	// 文件后缀合法性
	if ok := allExtMap(extMap, extName); !ok {
		i.JSON(map[string]interface{}{
			"msg":  "图片后缀不合法",
			"data": extMap,
			"code": false,
		})
		return
	}
	// 创建文件路径
	ok, pathDir := Mkdir(extName, "/img")
	if !ok {
		i.JSON(map[string]interface{}{
			"msg":  "创建文件路径失败",
			"data": "上传失败",
			"code": false,
		})
		return
	}

	// 保存图片
	i.SaveFormFile(fileHeader, pathDir)

	i.JSON(map[string]interface{}{
		"msg":      "文件上传成功",
		"data":     u.ImgAddress+pathDir,
		"filename": fileHeader.Filename,
		"code": 20000,
	})

}

/*
上传xlsx
*/

func (u Uplaod) UploadXlsx(i iris.Context) {
	// 设置文件上传大小

	i.SetMaxRequestBodySize(int64(maxSize))

	// 读取file文件
	f, fileHeader, err := i.FormFile("file")
	// 读取文件流失败
	if err != nil {
		i.StopWithError(iris.StatusBadRequest, err)
		return
	}
	// 关闭文件流
	defer f.Close()
	// 文件后缀
	extName := path.Ext(fileHeader.Filename)
	// 获取配置文件  组成 map对象
	config := config.InitConfig()
	extMap := config.ImportExcel
	fmt.Println(extMap)
	// 文件后缀合法性
	if ok := allExtMap(extMap, extName); !ok {
		i.JSON(map[string]interface{}{
			"msg":  "excel不合法",
			"data": extMap,
			"code": false,
		})
		return
	}
	// 创建文件路径
	ok, pathDir := Mkdir(extName, "/xlsx")
	if !ok {
		i.JSON(map[string]interface{}{
			"msg":  "创建文件路径失败",
			"data": "上传失败",
			"code": false,
		})
		return
	}

	// 文件流读取xlsx
	if bo, row := importXlsx(f); bo {
		// 保存文件
		i.SaveFormFile(fileHeader, pathDir)

		i.JSON(map[string]interface{}{
			"msg":      "文件上传成功",
			"data":     u.ImgAddress+pathDir,
			"datas":    row,
			"filename": fileHeader.Filename,
			"code": 20000,
		})
	} else {
		i.JSON(map[string]interface{}{
			"msg":      "文件上传失败",
			"filename": fileHeader.Filename,
			"code":     2001,
		})
	}

}

type User struct {
	Data []interface{} `json:"data"`
}

/**
导出xlsx
*/
func (u Uplaod) UploadExportXlsx(i iris.Context) {
	// 定义结构体接受 json
	//var con User
	////con := make(map[interface{}]interface{})
	//i.ReadJSON(&con)
	//fmt.Println(con)
	var CellType = []string{
		"A",
		"B",
		"C",
		"D",
		"E",
		"F",
		"G",
		"H",
		"I",
		"J",
		"K",
		"L",
		"M",
		"N",
		"O",
		"P",
		"Q",
		"R",
		"S",
		"T",
		"U",
		"V",
		"W",
		"X",
		"Y",
		"Z",
	}

	// 定义map[type]type 接受json格式
	var results []map[string]interface{}
	i.ReadJSON(&results)
	fmt.Println(results)

	// 转二维数组
	var res [][]string
	for _, v := range results {
		var r []string
		for _, v1 := range v {
			r = append(r, v1.(string))
		}
		res = append(res, r)
	}
	fmt.Println(res)

	// 转为map
	 con := map[string]string{}
	for i := 0; i < len(res); i++ {
		for j := 0; j < len(res[i]); j++ {
			con[CellType[j]+strconv.Itoa(i+1)] = res[i][j]
		}
	}
	fmt.Println(con)


	//i.WriteString("999")
	f := excelize.NewFile()
	// 创建一个工作表
	index := f.NewSheet("Sheet1")
	// 设置单元格的值
	//f.SetCellValue("Sheet2", "A2", "Hello world.")
	for k,v := range con {
		f.SetCellValue("Sheet1", k, v)
	}

	// 设置工作簿的默认工作表
	f.SetActiveSheet(index)
	// 创建文件路径
	ok, pathDir := Mkdir(".xlsx", "/xlsx")
	if !ok {
		i.JSON(map[string]interface{}{
			"msg":  "创建文件路径失败",
			"data": "上传失败",
			"code": false,
		})
		return
	}
	// 根据指定路径保存文件
	if err := f.SaveAs(pathDir); err != nil {
		fmt.Println(err)
	}
	i.JSON(map[string]interface{}{
		"data": u.ImgAddress+pathDir,
		"code": 20000,
	})
}

/*
xlsx上传处理
*/
func importXlsx(r io.Reader) (bo bool, row [][]string) {
	f, err := excelize.OpenReader(r)
	if err != nil {
		fmt.Println(err)
		return false, nil
	}
	// 获取工作表中指定单元格的值
	err1 := f.GetCellValue("Sheet1", "C102")
	fmt.Println(err1)

	// 获取 Sheet1 上所有单元格
	rows := f.GetRows("Sheet1")
	fmt.Println(rows, "--------")
	for _, row := range rows {
		// 有2020031051就不保存
		//if row[0] == "2020031051" {
		//	return false, nil
		//}
		fmt.Println(row)
	}

	return true, rows
}

/*
文件后缀
*/

func allExtMap(extMap []string, extName string) bool {
	allowExtMap := make(map[string]bool)
	for _, val := range extMap {
		fmt.Println(val)
		allowExtMap[val] = true
	}
	fmt.Println(allowExtMap)
	// 判断excel上传是否合法
	if _, ok := allowExtMap[extName]; !ok {

		return false
	}
	return true
}

/*
创建文件夹/文件名
*/
func Mkdir(extName, route string) (bool, string) {
	// 组成 文件路径
	dir := "static/upload/" + utils.GetDay() + route
	// 创建文件路径
	if err := os.MkdirAll(dir, 0666); err != nil {
		return false, ""
	}
	//生成文件名称   144325235235.png
	fileUnixName := strconv.FormatInt(utils.GetUnixNano(), 10)
	saveDir := path.Join(dir, fileUnixName+extName)

	return true, saveDir
}
